package lyttest.service.impl;

import lyttest.entity.dto.FileDTO;
import lyttest.entity.po.FilePO;
import lyttest.entity.vo.FileVO;
import lyttest.service.FileService;
import lyttest.uils.PageResult;
import lyttest.uils.StringUtils;
import org.springframework.stereotype.Service;

import java.io.File;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static com.sun.media.sound.AuFileWriter.UNKNOWN_SIZE;

@Service
public class FileServiceImpl implements FileService {
    @Override
    public FilePO queryDetail(FileDTO fileDTO) {
        return null;
    }

    @Override
    public PageResult<FilePO> page(FileDTO fileDTO) {
        return null;
    }

    @Override
    public Integer delete(FileDTO fileDTO) {
        return 0;
    }

    @Override
    public Integer createOrUpdate(FileDTO fileDTO) {
        return 0;
    }


//    @Override
//    public int delete(FileDTO fileDTO) {
//        return 0;
//    }
//
//    @Override
//    public Map<String, Object> queryList(FileDTO fileDTO) {
//        return null;
//    }


    // 复杂分页查询示例
    // 以下代码是从接口获取数据再进行分页处理，对时间起始，名称模糊查询

//    public PageResult<FileVO> cosPage(BucketInfoDTO bucketInfoDTO) {
//        //获取s3客户端
//        AmazonS3Client s3 = this.getAmazonS3Client(bucketInfoDTO);
//        if (StringUtils.isBlank(bucketInfoDTO.getBucketName())) {
//            return new PageResult<>();
//        }
//
//        ListObjectsV2Request listObjectsV2Request = null;
//        //根目录
//        if (bucketInfoDTO.getDir().equals("/")) {
//            listObjectsV2Request = new ListObjectsV2Request()
//                    .withBucketName(bucketInfoDTO.getBucketName())
//                    .withPrefix("")
//                    .withDelimiter("/");
//            //非根目录
//        } else {
//            // 初始化 ListObjectsV2Request
//            listObjectsV2Request = new ListObjectsV2Request()
//                    .withBucketName(bucketInfoDTO.getBucketName())
//                    .withPrefix(bucketInfoDTO.getDir())
//                    .withDelimiter("/");
//
//        }
//
//        // 用于分页的延续令牌
//        String continuationToken = null;
//
//        //key list
//        List<FileVO> list = new ArrayList<>();
//        do {
//            // 设置请求中的延续令牌
//            if (continuationToken != null) {
//                listObjectsV2Request.setContinuationToken(continuationToken);
//            }
//            // 获取当前页的对象列表
//            ListObjectsV2Result result = s3.listObjectsV2(listObjectsV2Request);
//
//
//            //文件夹list
//            for (String folderName : result.getCommonPrefixes()) {
//                if (!folderName.equals(bucketInfoDTO.getDir())) {
//                    String[] parts = folderName.split("/");
//                    FileVO info = new FileVO();
//                    if (parts.length > 0 && !parts[parts.length - 1].isEmpty()) {
//                        info.setFileId(parts[parts.length - 1]);
//                        //文件夹大小展示为空
//                        info.setSize(UNKNOWN_SIZE);
//                        info.setFileType(IS_FOLDER);
//                        String name = parts[parts.length - 1];
//                        //处理文件名乱码问题todo
//                        info.setFileName(name);
//                    }
//                    list.add(info);
//                }
//            }
//
//            // 文件list
//            for (S3ObjectSummary summary : result.getObjectSummaries()) {
//                if (!summary.getKey().equals(bucketInfoDTO.getDir())) {
//                    FileVO fileInfo = new FileVO();
//                    //截取文件名称
//                    File file = new File(summary.getKey());
//                    String name = file.getName();
//                    fileInfo.setFileName(name);
//                    fileInfo.setFileId(summary.getKey());
//                    //判断文件类型是否是图片
//                    boolean image = ImageUtil.isImage(name);
//                    if (image) {
//                        //1 图片  0 非图片
//                        fileInfo.setFileImageType(IS_IMAGE);
//                    } else {
//                        fileInfo.setFileImageType(IS_NOT_IMAGE);
//                    }
//
//                    fileInfo.setLastModifiedTime(summary.getLastModified().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
//                    fileInfo.setSize(summary.getSize());
//                    fileInfo.setFileType(IS_NOT_FOLDER);
//                    list.add(fileInfo);
//                }
//
//            }
//            // 更新 continuationToken
//            continuationToken = result.getNextContinuationToken();
//        } while (continuationToken != null);
//
//        LocalDateTime startTime = bucketInfoDTO.getStartTime();
//        LocalDateTime endTime = bucketInfoDTO.getEndTime();
//        String input = bucketInfoDTO.getName();
//        if (StringUtils.isNull(startTime) && StringUtils.isNull(endTime) && StringUtils.isNull(input)) {
//            return this.getPageList(list, bucketInfoDTO.getCurrPage(), bucketInfoDTO.getPageSize());
//        }
//
//        //筛选时间或者名称
//        List<FileVO> bucketFileList = new ArrayList<>();
//        for (FileVO item : list) {
//            if (StringUtils.isNotNull(startTime) && StringUtils.isNotNull(endTime) && StringUtils.isNotNull(item.getLastModifiedTime())
//                    && startTime.isBefore(item.getLastModifiedTime()) && endTime.isAfter(item.getLastModifiedTime())) {
//                bucketFileList.add(item);
//            }
//            //模糊查询名称
//            if (StringUtils.isNotNull(input)) {
//                boolean b = fuzzySearch(bucketInfoDTO.getName(), item.getFileName());
//                if (b) {
//                    bucketFileList.add(item);
//                }
//            }
//
//        }
//        return this.getPageList(bucketFileList, bucketInfoDTO.getCurrPage(), bucketInfoDTO.getPageSize());
//    }


    /**
     * 手动获取分页数据
     *
     * @param list
     * @param currentPage
     * @param pageSize
     * @return
     */
    public PageResult<FileVO> getPageList(List<FileVO> list, int currentPage, int pageSize) {
        int fromIndex = (currentPage - 1) * pageSize;
        int toIndex = Math.min(fromIndex + pageSize, list.size());
        List<FileVO> pageList = list.subList(fromIndex, toIndex);
        return new PageResult<>(pageList, list.size(), currentPage, pageSize);
    }


    /**
     * 对名称模糊查询
     * @param input
     * @param content
     * @return
     */
    public boolean fuzzySearch(String input, String content) {
        Pattern pattern = Pattern.compile(".*" + input + ".*"); // 构建正则表达式，.* 表示任意数量的任意字符
        Matcher matcher = pattern.matcher(content);
        if (matcher.matches()) {
            return true;
        }
        return false;
    }
}
